"""
此段代码主要用于自动统计各个项目人员的工作量
1.读取CSV文件列表
2.合并成统一的DateFrame对象
3.按个人和月份统计工作量
4.生成图表
5.保存成本地文件浏览
"""
import os
import pandas as pd
import chardet
from pyecharts import options as opts
from pyecharts.charts import Bar
import matplotlib.pyplot as plt

# 避免matplotlib中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']

# 在固定的路径下遍历文件夹，获取CSV文件名列表
def get_file_list(path):
    file_list = []
    for root, dirs, files in os.walk(path):
        for file in files:
            # 默认情况下，只读取路径下的CSV类型的文件
            if os.path.splitext(file)[1].lower() == '.csv':
                file_list.append(file)

    return file_list


# 通过地址+文件名列表，使用pandas库分别读取CSV文件内容，生成并返回一个DateFrame对象
def get_file_content(file_list):
    # 定义一个DateFrame类型的对象file_content
    file_content = pd.DataFrame()
    for file in file_list:
        # 将查询的结果合并成一个DateFrame类型的对象file_content
        file_content = pd.concat([file_content, pd.read_csv(path + file, encoding=file_encoding)], axis=0)

    return file_content


# 检测CSV文件的编码类型并返回编码类型
def check_file_encoding(file_path):
    with open(file_path, 'rb') as f:
        # 读取文件的前1024个字节作为样本进行检测
        sample = f.read(1024)
        # 使用chardet.detect方法检测文件的编码类型
        encoding_info = chardet.detect(sample)
        encoding = encoding_info.get('encoding')
        return encoding if encoding is not None else "Unknown"


# 在项目内定义一个path路径
# path = 'C:/Users/pc/Desktop/新建文件夹/'
path = '/Users/conan/Downloads/'

# 调用get_file_list()方法获取文件名列表
file_list = get_file_list(path)

# 读取第一个文件的编码类型
file_encoding = check_file_encoding(path + file_list[0])

# 调用get_file_content()方法获取文件内容，返回DataFrame对象file_content
file_content = get_file_content(file_list)

# 通过pandas库的groupby方法，按‘用户’列对‘小时’列的内容进行工作量汇总统计
grouped = file_content.groupby(['用户'])['小时'].sum().sort_values(ascending=False)

# # 使用pyecharts库绘制柱状图
# bar = (
#     Bar()
#     .add_xaxis(grouped.index.tolist())
#     .add_yaxis('工作量', grouped.tolist())
#     .set_global_opts(
#         title_opts=opts.TitleOpts(title='工作量统计'))
# )

# # 将生成的图表生成PDF文件并保存至本地路径
# bar.render('工作量统计.html')

# 使用matplotlib库绘制柱状图，显示标题、横纵坐标
grouped.plot(kind='bar', title='工作量统计', x='用户', y='小时',rot=90)

# 保存本地并生成pdf文件
plt.savefig('工作量统计.pdf')